<?php
/**
 *
 * 插件管理类
 * @author kwor
 *
 */
if (!defined('VALIDADMIN')) die ('Access Denied.');
class PluginManager{
	private $_listeners = array();//监听插件的数组

	var $dir;
	public function __construct($dir){
		$this->dir=$dir;
	}


	/**
	 *
	 * 载入插件类
	 * @param $directory  //插件目录
	 */
	function on_plugins($directory='plugins/') {
		$plugins = $this->get_active_plugins($directory);//获取已经由用户激活的插件信息
		if(!empty($plugins)){
			foreach($plugins as $plugin){
				$file = $plugin['directory'].'/'.$plugin['name'].'.php';
				if(file_exists($file)){
					include_once($file);//引入插件
					$class = $plugin['name'];
					if (class_exists($class)){//初始化所有插件
						new $class($this);//实例化插件类
					}else{
						exit('在'.$file.'文件中没有发现插件类,正确的类为:'.$class);
					}
				}else{
					exit($file.'插件文件不存在');
				}
			}
		}
		else{
			exit('系统中暂时没有插件');
		}

	}



	/**
	 * 获得模块的名称以及所在文件夹
	 *
	 * @access      public
	 * @param       string      $directory      插件存放的目录
	 * @return      array
	 */

	function get_active_plugins($directory = 'plugins')
	{
		$dir         = @opendir($directory);
		while (false !== ($file = @readdir($dir)))
		{
			if (preg_match("/^.*?\.php$/", $file))
			{
				$classname = explode('.', $file);//文件名和类名必须一致，且类名不能有.
				$plugin['name']=$classname[0];
				$plugin['directory']=$directory;
				$plugins[]=$plugin;

			}
		}
		@closedir($dir);
		return $plugins;
	}




	/**
	 *
	 * 插件的注册函数
	 * @param unknown_type $plugin_name
	 * @param unknown_type $plugin_class
	 * @param unknown_type $plugin_method
	 */
	function register($plugin_name, &$plugin_class,$plugin_method){
		$key = get_class($plugin_class).'->'.$plugin_method;//获取插件要实现的方法
		$this->_listeners[$plugin_name][$key] = array(&$plugin_class,$plugin_method);//将插件的引用连同方法push进监听数组中

	}





	/**
	 *
	 * 调用插件的指定方法
	 * @param $plugin_name  插件名称
	 * @param $methodname   要调用的插件方法名称
	 * @param $data         方法的参数数组
	 */
	function trigger($plugin_name='',$methodname='', $data='')
	{
		$this->on_plugins($this->dir); //载入插件类
		if($plugin_name=='')
		{
			$allhook=$this->_listeners;
			foreach ($allhook as $hook){
				if (isset($hook)&&is_array($hook)&&count($hook)>0){
					foreach ($hook as $plugin){ // 取出插件对象的引用和方法
						$class  =&$plugin[0];
						$method = $plugin[1];
						if(method_exists($class,$method)) {// 动态调用插件的方法
							if($methodname==''){//没有指定方法就执行该类的所有方法
								$res.=$class->$method($data);//执行插件中的方法
							}else {
								if($method==$methodname){
									$res.=$class->$method($data);//执行插件中的方法
								}
							}
						}
					}

				}
			}
		}else {
			$hook = $this->_listeners[$plugin_name];//钩子
			if (isset($hook)&&is_array($hook)&&count($hook)>0){
				foreach ($hook as $plugin){ // 取出插件对象的引用和方法
					$class  =&$plugin[0];
					$method = $plugin[1];
					if(method_exists($class,$method)) {// 动态调用插件的方法
						if($methodname==''){//没有指定方法就执行该类的所有方法
							$res.=$class->$method($data);//执行插件中的方法
						}else {
							if($method==$methodname){
								$res.=$class->$method($data);//执行插件中的方法
							}
						}
					}
				}

			}

		}
		return $res;

	}



	//支付插提交件按钮构建函数
	function paybtn(){
		$btnstr='<script>
var formSubmit = function(){ 
	var chkform=document.getElementsByName("paytype");
	for(i=0;i<chkform.length;i++){
	if(chkform[i].checked){
	  var chkval= chkform[i].value;
	 }
	}
    var formObj = document.getElementById(chkval);   
    while(formObj.nodeName.toLowerCase() != "form"){     
        formObj = formObj.parentNode;     
    }   
    formObj.submit();   
}  
</script>';
		$btnstr.='<INPUT class=formbutton onClick="formSubmit()"
	type=button value=确认订单，付款>';


		return $btnstr;
	
	
}

}



?>
